package old.business;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.EntityType;

import old.entity.Pessoa;
import old.entity.Transferencia;
import old.entity.Veiculo;


//@Stateless
//@LocalBean
public class VeiculoBusiness {
	//@PersistenceContext(unitName = "almirante")
	private EntityManager em;

	//Default é requisitar uma nova transação
	//@TransactionAttribute(TransactionAttributeType.)
	public void cadastrarVeiculo(Veiculo veiculo) throws Exception {

		if (veiculo == null) {
			throw new Exception("parametros.invalidos");
		}
		try {
			//Verifica se já possui placa
			Query query = em.createNamedQuery("pesquisarPlaca");
			query.setParameter("placa", veiculo.getPlaca());
			
			if (query.getResultList().size() > 0){
				throw new Exception("Erro. Placa já cadastrada");
			}
			
			em.persist(veiculo);
			
			Pessoa pessoa = em.find(Pessoa.class,(veiculo.getPessoa().getIdPessoa()));
			
			pessoa.setVeiculo(veiculo);
			
			em.merge(pessoa);
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception(e.getMessage());
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Veiculo> listarVeiculo() throws Exception {

		List<Veiculo> resultList = em.createNamedQuery("listarVeiculos").getResultList();
		
		return resultList;
	}
	
	public List<Veiculo> pesquisarVeiculo(Veiculo veiculo) {
		
		CriteriaBuilder cb = em.getCriteriaBuilder();  
		CriteriaQuery cq = cb.createQuery(Veiculo.class);  
		Root<Veiculo> root = cq.from(Veiculo.class);  
		EntityType<Veiculo> modelo = root.getModel(); 
		
		if (veiculo.getPlaca() != null && !"".equals(veiculo.getPlaca())){
			Predicate placa = cb.equal(root.get("placa"), veiculo.getPlaca());  
			cq.where(placa); 
		}
		
		Query query = em.createQuery(cq);
		List result = query.getResultList();  
		
		return (List<Veiculo>) result;
	}
	
	public Veiculo obterVeiculo (Long idVeiculo) throws Exception{
		
		return em.find(Veiculo.class,idVeiculo);
	}
	
	public void alterarVeiculo(Veiculo veiculo) throws Exception {

		em.merge(veiculo);

	}
	
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public void realizarTransferencia(Veiculo veiculo, Transferencia transferencia) throws Exception {

		try {
			
			Pessoa vendedor = veiculo.getPessoa();
			vendedor = em.find(Pessoa.class, vendedor.getIdPessoa());
			Pessoa comprador = em.find(Pessoa.class, transferencia.getComprador().getIdPessoa());
			
			
			transferencia.setVeiculo(veiculo);
			transferencia.setVendedor(vendedor);
			em.persist(transferencia);
			
			
			vendedor.setVeiculo(null);
			em.merge(vendedor);
			
			
			veiculo.setPessoa(comprador);
			em.merge(veiculo);
			
			
			comprador.setVeiculo(veiculo);
			em.merge(comprador);
			
			
		} catch (Exception e) {
			e.printStackTrace();
			
			throw new Exception(e);
		}
		
	}

}
